package org.zengrong.utils {
	import flash.display.BitmapData;
	import flash.geom.Point;
	import flash.geom.Rectangle;

	/**
	 * 提供位图相关的计算工具
	 * @author zrong
	 *
	 */
	public class BitmapUtil {
		/**
		 * 将一个ARGB分割成包含a,r,g,b值的普通对象
		 */
		public static function splitARGB($argb:uint):Object {
			return {a: $argb >> 24 & 0xFF, r: $argb >> 16 & 0xFF, g: $argb >> 8 & 0xFF, b: $argb & 0xFF};
		}

		/**
		 * 将位图左上角像素颜色视为空白区域的颜色，切除四周的空白区域
		 * @param $bmd 待处理的bitmapData。
		 * @return 一个普通对象，形如：{rect:Rectangle,bitmapData:BitmapData}。
		 * 其中，rect为切除空白区域后的Rect（基于原始bitmapData的rect修改），
		 * bitmapData则是一个新的切除了空白区域的bitmapData对象
		 */
		public static function trim($bmd:BitmapData):Object {
			var _rect:Rectangle = $bmd.rect.clone();
			var _y:int = 0;
			var _x:int = 0;
			//将左上角像素的颜色视为空白区域的颜色
			var _blankColor:uint = $bmd.getPixel32(0, 0);
			
			topOuter: for (_y = 0; _y < $bmd.height; _y++){
				for (_x = 0; _x < $bmd.width; _x++){
					if (_blankColor != $bmd.getPixel32(_x, _y)) //比较像素点
						break topOuter;
				}
				_rect.top++;
			}
			
			bottomOuter: for (_y = $bmd.height - 1; _y >= _rect.top; _y--){
				for (_x = 0; _x < $bmd.width; _x++){
					if (_blankColor != $bmd.getPixel32(_x, _y))
						break bottomOuter;
				}
				_rect.bottom--;
			}
			leftOuter: for (_x = 0; _x < $bmd.width; _x++){
				for (_y = _rect.top; _y < _rect.bottom; _y++){
					if (_blankColor != $bmd.getPixel32(_x, _y))
						break leftOuter;
				}
				_rect.left++;
			}
			rightOuter: for (_x = $bmd.width - 1; _x >= _rect.left; _x--){
				for (_y = _rect.top; _y < _rect.bottom; _y++){
					if (_blankColor != $bmd.getPixel32(_x, _y))
						break rightOuter;
				}
				_rect.right--;
			}
			if (_rect.width <= 0 || _rect.height <= 0){
				trace('空位图原样返回');
				return {rect: $bmd.rect.clone(), bitmapData: $bmd.clone()};
			}
			var _bmd:BitmapData = new BitmapData(_rect.width, _rect.height, $bmd.transparent, 0x00000000);
			_bmd.copyPixels($bmd, _rect, new Point(0, 0), null, null, true);
			trace(_rect.top,_rect.left,_rect.bottom,_rect.right)
			return {rect: _rect, bitmapData: _bmd};
		}
	}
}